home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
pao
/
pvs_pvd
/
src
/
pvd.c
< prev
next >
Wrap
Text File
|
1994-06-01
|
33KB
|
938 lines
/* << HighC V1.7 >> [FM-TOWNS] **********************************************
*
* .PVS 表示プログラム
* ----------------------------------------------------------------------
* Programmed by Y.Hirata ( NIFTY-ID: NAB03321 パオパオ )
*
* NOTE: TAB=4
****************************************************************************/
#include <string.h> /* movedata */
#include <stdlib.h> /* malloc,free */
#include <conio.h> /* inp,outp */
#include <fmcfrb.h> /* TIM_* */
#include <msdos.cf> /* getds */
#include <mos.h> /* MOS_* */
#include <snd.h> /* SND_* */
#include "egbtxt.h"
#include "pvd.h"
#include "tiffhead.h"
char Mwork[MosWorkSize] ; /* MOS作業領域 */
char _mos_cur[258] ; /* マウスカーソル(アイコン) */
char _tmp[TMP_SIZE] ; /* 作業領域 */
_PAL_16 _palini = { 16, /* 16色デフォルトパレット */
0, 0x00, 0x00, 0x00, 0,
1, 0xB0, 0x00, 0x00, 0,
2, 0x00, 0xB0, 0x00, 0,
3, 0xB0, 0xB0, 0x00, 0,
4, 0x00, 0x00, 0xB0, 0,
5, 0xB0, 0x00, 0xB0, 0,
6, 0x00, 0xB0, 0xB0, 0,
7, 0xB0, 0xB0, 0xB0, 0,
8, 0x00, 0x00, 0x00, 0,
9, 0xF0, 0x00, 0x00, 0,
10, 0x00, 0xF0, 0x00, 0,
11, 0xF0, 0xF0, 0x00, 0,
12, 0x00, 0x00, 0xF0, 0,
13, 0xF0, 0x00, 0xF0, 0,
14, 0x00, 0xF0, 0xF0, 0,
15, 0xF0, 0xF0, 0xF0, 0
} ;
_PAL_16 _pal160, _pal161 ; /* 16色パレット設定用 */
_PAL_256 _pal256 ; /* 256色パレット設定用 */
char *_msg[] = {
"page 0 page 1 表示",
" 1 ( 640 * 400 16 24KHz ノンインタレース ) 1 page 0",
" 2 ( 640 * 200 16 24KHz ノンインタレース ) 2 page 1",
" 3 ( 640 * 480 16 31KHz ノンインタレース ) 3 0 前面",
" 4 ( 640 * 400 16 24KHz ノンインタレース ) 4 1 前面",
" 5 ( 256 * 256 32K 31KHz ノンインタレース ) 5",
" 6 ( 256 * 256 32K 24KHz ノンインタレース ) 6 X0 1倍",
" 7 ( 256 * 240 32K 15KHz インタレース ) 7 2倍",
" 8 ( 256 * 240 32K 15KHz ノンインタレース ) 8 4倍",
" 9 ( 360 * 240 32K 15KHz インタレース ) 9 Y0 1倍",
"10 ( 320 * 240 32K 31KHz ノンインタレース ) 10 2倍",
"11 ( 320 * 240 32K 15KHz ノンインタレース ) 11 4倍",
"12 ( 640 * 480 256 31KHz ノンインタレース ) X1 1倍",
"13 ( 640 * 400 256 24KHz ノンインタレース ) 2倍",
"14 ( 720 * 480 256 15KHz インタレース ) MS-DOS 4倍",
"15 ( 320 * 480 32K 31KHz ノンインタレース ) Y1 1倍",
"16 ( 320 * 480 32K 15KHz インタレース ) 2倍",
"17 ( 512 * 480 32K 31KHz ノンインタレース ) 4倍",
"18 ( 512 * 480 32K 15KHz インタレース )",
"実行 終了 TIFF保存"
} ;
struct {
int xs, ys ;
int xe, ye ;
} _dpara[] = {
/* 0 */ { 48, 40, -1, 55 }, /* タイトル */
/* 1 */ { 48, 60, 367, 75 }, /* 0-1 */
/* 2 */ { 48, 80, 367, 95 }, /* 0-2 */
/* 3 */ { 48, 100, 367, 115 }, /* 0-3 */
/* 4 */ { 48, 120, 367, 135 }, /* 0-4 */
/* 5 */ { 48, 140, 367, 155 }, /* 0-5 */
/* 6 */ { 48, 160, 367, 175 }, /* 0-6 */
/* 7 */ { 48, 180, 367, 195 }, /* 0-7 */
/* 8 */ { 48, 200, 367, 215 }, /* 0-8 */
/* 9 */ { 48, 220, 367, 235 }, /* 0-9 */
/* 10 */ { 48, 240, 367, 255 }, /* 0-10 */
/* 11 */ { 48, 260, 367, 275 }, /* 0-11 */
/* 12 */ { 48, 280, 367, 295 }, /* 0-12 */
/* 13 */ { 48, 300, 367, 315 }, /* 0-13 */
/* 14 */ { 48, 320, 367, 335 }, /* 0-14 */
/* 15 */ { 48, 340, 367, 355 }, /* 0-15 */
/* 16 */ { 48, 360, 367, 375 }, /* 0-16 */
/* 17 */ { 48, 380, 367, 395 }, /* 0-17 */
/* 18 */ { 48, 400, 367, 415 }, /* 0-18 */
/* 19 */ { 416, 60, 447, 75 }, /* 1-1 */
/* 20 */ { 416, 80, 447, 95 }, /* 1-2 */
/* 21 */ { 416, 100, 447, 115 }, /* 1-3 */
/* 22 */ { 416, 120, 447, 135 }, /* 1-4 */
/* 23 */ { 416, 140, 447, 155 }, /* 1-5 */
/* 24 */ { 416, 160, 447, 175 }, /* 1-6 */
/* 25 */ { 416, 180, 447, 195 }, /* 1-7 */
/* 26 */ { 416, 200, 447, 215 }, /* 1-8 */
/* 27 */ { 416, 220, 447, 235 }, /* 1-9 */
/* 28 */ { 416, 240, 447, 255 }, /* 1-10 */
/* 29 */ { 416, 260, 447, 275 }, /* 1-11 */
/* 30 */ { 504, 60, 551, 75 }, /* page0 */
/* 31 */ { 504, 80, 551, 95 }, /* page1 */
/* 32 */ { 504, 100, 551, 115 }, /* 0前面 */
/* 33 */ { 504, 120, 551, 135 }, /* 1前面 */
/* 34 */ { 384, 420, 415, 435 }, /* 実行 */
/* 35 */ { 440, 420, 471, 435 }, /* 終了 */
/* 36 */ { 504, 160, 551, 175 }, /* 0 X1倍 */
/* 37 */ { 504, 180, 551, 195 }, /* 0 X2倍 */
/* 38 */ { 504, 200, 551, 215 }, /* 0 X4倍 */
/* 39 */ { 504, 220, 551, 235 }, /* 0 Y1倍 */
/* 40 */ { 504, 240, 551, 255 }, /* 0 Y2倍 */
/* 41 */ { 504, 260, 551, 275 }, /* 0 Y4倍 */
/* 42 */ { 504, 280, 551, 295 }, /* 1 X1倍 */
/* 43 */ { 504, 300, 551, 315 }, /* 1 X2倍 */
/* 44 */ { 504, 320, 551, 335 }, /* 1 X4倍 */
/* 45 */ { 504, 340, 551, 355 }, /* 1 Y1倍 */
/* 46 */ { 504, 360, 551, 375 }, /* 1 Y2倍 */
/* 47 */ { 504, 380, 551, 395 }, /* 1 Y4倍 */
/* 48 */ { 408, 320, 455, 335 }, /* MS-DOS */
/* 49 */ { 496, 420, 559, 435 } /* TIF保存 */
} ;
_SELECT_PARA _para = { /* 選択状態の情報 */
NULL, NULL, NULL,
3, 3, 3,
1,1, 1,1, 0,0, 0,0, 0,0, 0,0,
0,0, 0,0
} ;
_SCREEN_PARA _screen[] = { /* 画面モードの情報 */
{ 4, 640,400, 640, 819, 1,1 }, /* 1:16 */
{ 4, 640,200, 640, 819, 1,2 }, /* 2:16 */
{ 4, 640,480, 1024,512, 1,1 }, /* 3:16 */
{ 4, 640,400, 1024,512, 1,1 }, /* 4:16 */
{ 16, 256,256, 256, 512, 1,1 }, /* 5:32K */
{ 16, 256,256, 256, 512, 1,1 }, /* 6:32K */
{ 16, 256,240, 256, 512, 3,1 }, /* 7:32K */
{ 16, 256,240, 256, 512, 3,1 }, /* 8:32K */
{ 16, 360,240, 512, 256, 3,1 }, /* 9:32K */
{ 16, 320,240, 512, 256, 1,1 }, /* 10:32K */
{ 16, 320,240, 512, 256, 3,1 }, /* 11:32K */
{ 8, 640,480, 1024,512, 1,1 }, /* 12:256 */
{ 8, 640,400, 1024,512, 1,1 }, /* 13:256 */
{ 8, 720,480, 1024,512, 2,1 }, /* 14:256 */
{ 16, 320,480, 512, 512, 2,1 }, /* 15:32K */
{ 16, 320,480, 512, 512, 3,1 }, /* 16:32K */
{ 16, 512,480, 512, 512, 1,1 }, /* 17:32K */
{ 16, 512,480, 512, 512, 1,1 } /* 18:32K */
} ; /* 初期倍率 : 1=1倍, 2=2倍, 3=4倍 */
/* MS-DOS mode
---------------- */
int _crtc[] = {
0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
} ;
#if 0
char _vdc[] = { 0x15,0x09 } ;
#endif
int _crtc_dos[] = {
0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
} ;
long _tim0=0 ; /* カウンタ */
long _tim1=0 ; /* カウンタ */
static int int_handler( void )
{
_tim0++ ;
_tim1++ ;
return 0 ;
}
void crtc_out( int reg )
{
outp( 0x440,reg ) ;
outpw( 0x442,_crtc[reg] ) ;
}
void mosBreak( void )
{
int mbot, mx, my ;
do {
MOS_rdpos( &mbot,&mx,&my ) ; /* マウス情報取得 */
} while ( mbot ) ; /* ボタンonの間 */
}
int mosButton( void )
{
int mbot, mx, my ;
MOS_rdpos( &mbot,&mx,&my ) ; /* マウス情報取得 */
return mbot ;
}
void ginit( void )
{
EGB_init( Gwork,EgbWorkSize ) ; /* 初期化 */
EGB_resolution( Gwork,0,3 ) ; /* page0 16 color */
EGB_resolution( Gwork,1,3 ) ; /* page1 16 color */
EGB_displayPage( Gwork,0,1 ) ; /* page0のみ表示 */
EGB_writePage( Gwork,0 ) ; /* page0を処理開始 */
EGB_paintMode( Gwork,0x02 ) ;
EGB_writeMode( Gwork,M_OPAQUE ) ;
EGB_palette( Gwork,0,(char *)&_palini ) ; /* VSYNC待たずに設定 */
EGB_color( Gwork,C_FRONT,C_HWHITE ) ; /* 文字色 */
EGB_color( Gwork,C_BACK,C_BLACK ) ; /* 背景色 */
EGB_clearScreen( Gwork ) ; /* 画面クリア */
}
void minit( void )
{
MOS_start( Mwork,MosWorkSize ) ; /* 初期化 */
MOS_resolution( 0,3 ) ; /* page0, 16 color */
MOS_typeRom( 87,0,0,_mos_cur ) ; /* マウス形状変更 */
MOS_color( 0,C_HWHITE ) ; /* マウス表示色設定 */
MOS_setpos( 320,240 ) ; /* 画面中央 */
MOS_disp( FALSE ) ; /* 非表示 */
}
void to_vram( void )
{
int cnt, off ;
if ( _para.buf != NULL ) {
movedata( getds(),(unsigned int)_para.buf,0x120,0,VRAM_SIZE ) ;
return ;
}
if ( fseek( _para.fp,VRAM_OFFSET,SEEK_SET ) ) return ;
for ( cnt=0, off=0; cnt<512; cnt++, off+=TMP_SIZE ) {
if ( fread( _tmp,1,TMP_SIZE,_para.fp ) != TMP_SIZE ) break ;
movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
}
}
void reverse( int old,int new )
{
int xs, ys, xe, ye ;
if ( old == new ) return ;
MOS_disp( FALSE ) ; /* マウス非表示 */
if ( old > SEL_TIT && old < SEL_MAX ) {
xs = _dpara[old].xs - 2 ;
ys = _dpara[old].ys - 1 ;
xe = _dpara[old].xe + 2 ;
ye = _dpara[old].ye + 1 ;
box( xs,ys,xe,ye ) ;
}
if ( new > SEL_TIT && new < SEL_MAX ) {
xs = _dpara[new].xs - 2 ;
ys = _dpara[new].ys - 1 ;
xe = _dpara[new].xe + 2 ;
ye = _dpara[new].ye + 1 ;
box( xs,ys,xe,ye ) ;
}
MOS_disp( TRUE ) ; /* マウス表示 */
}
int select_msdos( void )
{
if ( _para.p0 < 1 ) return 1 ; /* MS-DOSだった */
reverse( _para.p0,-1 ) ; /* page0のモード解除 */
reverse( _para.disp+D0_0-1,-1 ) ; /* 表示ページ解除 */
reverse( _para.zx0+P0_X1-1,-1 ) ; /* page0のX倍率解除 */
reverse( _para.zy0+P0_Y1-1,-1 ) ; /* page0のY倍率解除 */
if ( _para.p0 < 12 ) { /* 2画面モードだった */
reverse( _para.p1+P1_1-1,-1 ) ; /* page1のモード解除 */
reverse( _para.zx1+P1_X1-1,-1 ) ; /* page1のX倍率解除 */
reverse( _para.zy1+P1_Y1-1,-1 ) ; /* page1のY倍率解除 */
}
_para.disp = 4 ; /* page1前面 */
reverse( -1,_para.disp+D0_0-1 ) ; /* 表示ページ設定 */
_para.zx0 = _para.zy0 = 1 ;
reverse( -1,_para.zx0+P0_X1-1 ) ; /* page0のX倍率設定 */
reverse( -1,_para.zy0+P0_Y1-1 ) ; /* page0のY倍率設定 */
_para.zx1 = _para.zy1 = 1 ;
reverse( -1,_para.zx1+P1_X1-1 ) ; /* page1のX倍率設定 */
reverse( -1,_para.zy1+P1_Y1-1 ) ; /* page1のY倍率設定 */
_para.p0 = _para.p1 = -1 ; /* page0/1モード無効 */
return 0 ;
}
int select_page0( int sel )
{
if ( _para.p0 < 0 ) { /* MS-DOSだった */
reverse( SEL_DOS,-1 ) ; /* MS-DOS解除 */
} else { /* MS-DOSではなかった */
reverse( _para.p0,-1 ) ; /* page0のモード解除 */
if ( _para.p0 < 12 ) { /* 2画面モードだった */
reverse( _para.p1+P1_1-1,-1 ) ; /* page1のモード解除 */
}
}
reverse( _para.disp+D0_0-1,-1 ) ; /* 表示ページ解除 */
reverse( _para.zx0+P0_X1-1,-1 ) ; /* page0のX倍率解除 */
reverse( _para.zy0+P0_Y1-1,-1 ) ; /* page0のY倍率解除 */
if ( _para.p0 < 12 ) { /* 2画面モードだった */
reverse( _para.zx1+P1_X1-1,-1 ) ; /* page1のX倍率解除 */
reverse( _para.zy1+P1_Y1-1,-1 ) ; /* page1のY倍率解除 */
}
_para.zx0 = _screen[sel-1].zx ;
_para.zy0 = _screen[sel-1].zy ;
reverse( -1,_para.zx0+P0_X1-1 ) ; /* page0のX倍率設定 */
reverse( -1,_para.zy0+P0_Y1-1 ) ; /* page0のY倍率設定 */
if ( sel < 12 ) { /* 2画面モード */
_para.p1 = sel ;
reverse( -1,_para.p1+P1_1-1 ) ; /* page1の画面モード設定 */
_para.disp = 3 ; /* page0前面 */
reverse( -1,_para.disp+D0_0-1 ) ; /* 表示ページ設定 */
_para.zx1 = _screen[sel-1].zx ;
_para.zy1 = _screen[sel-1].zy ;
reverse( -1,_para.zx1+P1_X1-1 ) ; /* page1のX倍率設定 */
reverse( -1,_para.zy1+P1_Y1-1 ) ; /* page1のY倍率設定 */
} else { /* 1画面モード */
_para.p1 = -1 ; /* page1の画面モード無効 */
_para.disp = 1 ; /* page0のみ表示 */
reverse( -1,_para.disp+D0_0-1 ) ; /* 表示ページ設定 */
_para.zx1 = _para.zy1 = -1 ; /* page1の倍率無効 */
}
_para.p0 = sel ; /* page0の画面モード */
return 0 ;
}
int page1_check( int p1 )
{
if ( _para.p0 == 1 ) {
if ( p1 == 1 || p1 == 4 ) return 0 ;
} else if ( _para.p0 == 2 ) {
if ( p1 == 2 ) return 0 ;
} else if ( _para.p0 == 3 || _para.p0 == 5 || _para.p0 == 10 ) {
if ( p1 == 3 || p1 == 5 || p1 == 10 ) return 0 ;
} else if ( _para.p0 == 4 || _para.p0 == 6 ) {
if ( p1 == 4 || p1 == 6 ) return 0 ;
} else if ( _para.p0 == 7 || _para.p0 == 9 ) {
if ( p1 == 7 || p1 == 9 ) return 0 ;
} else if ( _para.p0 == 8 || _para.p0 == 11 ) {
if ( p1 == 8 || p1 == 11 ) return 0 ;
}
return 1 ;
}
int select_page1( int sel )
{
if ( _para.p0 < 1 || _para.p0 > 11 ) return 1 ;
sel -= ( P1_1 - 1 ) ;
if ( page1_check( sel ) ) return 1 ;
reverse( _para.p1+P1_1-1,-1 ) ; /* 選択状態解除 */
reverse( _para.disp+D0_0-1,-1 ) ; /* 表示ページ解除 */
_para.disp = 4 ; /* page1前面 */
reverse( -1,_para.disp+D0_0-1 ) ; /* 表示ページ設定 */
reverse( _para.zx1+P1_X1-1,-1 ) ; /* page1のX倍率解除 */
reverse( _para.zy1+P1_Y1-1,-1 ) ; /* page1のY倍率解除 */
_para.zx1 = _screen[sel-1].zx ;
_para.zy1 = _screen[sel-1].zy ;
reverse( -1,_para.zx1+P1_X1-1 ) ; /* page1のX倍率設定 */
reverse( -1,_para.zy1+P1_Y1-1 ) ; /* page1のY倍率設定 */
_para.p1 = sel ; /* page1の画面モード */
return 0 ;
}
int select_disp( int sel )
{
sel -= ( D0_0 - 1 ) ;
if ( _para.p0 >= 12 && sel != 1 ) return 1 ; /* 1画面モード */
reverse( _para.disp+D0_0-1,-1 ) ; /* 表示ページ解除 */
_para.disp = sel ; /* 表示ページ選択 */
return 0 ;
}
int select_zoom( int sel )
{
if ( sel < P0_Y1 ) { /* page0 X */
sel -= ( P0_X1 - 1 ) ;
if ( _para.p0 >= 0 ) { /* MS-DOS以外 */
if ( sel < _screen[_para.p0-1].zx ) return 1 ;
}
reverse( _para.zx0+P0_X1-1,-1 ) ;
_para.zx0 = sel ;
} else if ( sel < P1_X1 ) { /* page0 Y */
sel -= ( P0_Y1 - 1 ) ;
if ( _para.p0 >= 0 ) { /* MS-DOS以外 */
if ( sel < _screen[_para.p0-1].zy ) return 1 ;
}
reverse( _para.zy0+P0_Y1-1,-1 ) ;
_para.zy0 = sel ;
} else if ( sel < P1_Y1 ) { /* page1 X */
if ( _para.p0 >= 12 ) return 1 ; /* 1画面モード */
sel -= ( P1_X1 - 1 ) ;
if ( _para.p0 >= 0 ) { /* MS-DOS以外 */
if ( sel < _screen[_para.p1-1].zx ) return 1 ;
}
reverse( _para.zx1+P1_X1-1,-1 ) ;
_para.zx1 = sel ;
} else { /* page1 Y */
if ( _para.p0 >= 12 ) return 1 ; /* 1画面モード */
sel -= ( P1_Y1 - 1 ) ;
if ( _para.p0 >= 0 ) { /* MS-DOS以外 */
if ( sel < _screen[_para.p1-1].zy ) return 1 ;
}
reverse( _para.zy1+P1_Y1-1,-1 ) ;
_para.zy1 = sel ;
}
return 0 ;
}
void select_on( int old,int new )
{
int ret ;
if ( new <= SEL_TIT || new >= SEL_MAX ) return ;
reverse( old,-1 ) ; /* カレント位置表示解除 */
EGB_color( Gwork,C_PAINT,C_HLBLUE ) ; /* 面塗り色 */
if ( new == SEL_DOS ) { /* MS-DOS */
ret = select_msdos() ;
} else if ( new < P1_1 ) { /* page0のモード */
ret = select_page0( new ) ;
} else if ( new < D0_0 ) { /* page1のモード */
ret = select_page1( new ) ;
} else if ( new < P0_X1 ) { /* 表示画面 */
ret = select_disp( new ) ;
} else { /* 表示拡大 */
ret = select_zoom( new ) ;
}
if ( !ret ) reverse( -1,new ) ; /* 選択OK! */
EGB_color( Gwork,C_PAINT,C_WHITE ) ; /* 面塗り色 */
reverse( -1,new ) ; /* カレント位置表示設定 */
}
int select( void )
{
int mbot, mx, my ;
int cnt, sel=-1 ;
MOS_disp( TRUE ) ; /* マウス表示 */
EGB_paintMode( Gwork,0x20 ) ; /* 面塗り */
EGB_writeMode( Gwork,M_XOR ) ; /* XOR描画 */
EGB_color( Gwork,C_PAINT,C_WHITE ) ; /* 面塗り色 */
mosBreak() ; /* マウス開放待ち */
while ( TRUE ) {
MOS_rdpos( &mbot,&mx,&my ) ; /* マウス情報取得 */
for ( cnt=P0_1; cnt<SEL_MAX; cnt++ ) {
if ( _dpara[cnt].xs > mx || _dpara[cnt].xe < mx ) continue ;
if ( _dpara[cnt].ys > my || _dpara[cnt].ye < my ) continue ;
break ;
}
if ( cnt >= SEL_MAX ) cnt = -1 ;
if ( mbot == MOS_RIGHT && cnt == SEL_TIF ) { /* 仮想画面 */
reverse( sel,cnt ) ;
savesize( TRUE ) ;
break ;
}
if ( mbot == MOS_LEFT && cnt > SEL_TIT ) { /* マウス左クリック */
if ( cnt == SEL_EXEC || cnt == SEL_END || cnt == SEL_TIF ) {
reverse( sel,cnt ) ;
if ( cnt == SEL_TIF ) savesize( FALSE ) ;
break ;
}
select_on( sel,cnt ) ;
mosBreak() ; /* マウス開放待ち */
} else if ( sel != cnt ) {
reverse( sel,cnt ) ;
}
sel = cnt ;
}
EGB_displayPage( Gwork,0,0 ) ; /* 画面非表示 */
mosBreak() ; /* マウス開放待ち */
MOS_disp( FALSE ) ; /* マウス非表示 */
return cnt ;
}
void setdos( void )
{
int cnt, off ;
int zx0, zy0, zx1, zy1 ;
for ( cnt=0; cnt<32; cnt++ ) _crtc[cnt] = _crtc_dos[cnt] ;
zx0 = _para.zx0 == 3 ? 3 : (_para.zx0-1) ;
zy0 = _para.zy0 == 3 ? 3 : (_para.zy0-1) ;
zx1 = _para.zx1 == 3 ? 3 : (_para.zx1-1) ;
zy1 = _para.zy1 == 3 ? 3 : (_para.zy1-1) ;
_crtc[0x1B] = (zy1<<12) + (zx1<<8) + (zy0<< 4) + zx0 ;
outp( 0x440,0x1C ) ; /* CR0 */
outp( 0x443,0 ) ; /* CRTC stop */
while ( inp( 0x443 ) & 0x80 ) ; /* busy check */
for ( cnt=0; cnt<32; cnt++ ) { /* CRTC内部レジスタ */
crtc_out( cnt ) ;
}
outp( 0x440,0x1C ) ; /* CR0 */
outp( 0x443,((_crtc[0x1C] >> 8) | 0x80) ) ; /* CRTC start */
outp( 0x448,1 ) ; /* プライオリティレジスタ */
outp( 0x44A,0x29 ) ; /* レイヤ1:16色パレット */
for ( cnt=0; cnt<16; cnt++ ) {
outp( 0xFD90,cnt ) ; /* palette no. */
outp( 0xFD92,_pal161.pal[cnt].b ) ; /* Blue */
outp( 0xFD94,_pal161.pal[cnt].r ) ; /* Red */
outp( 0xFD96,_pal161.pal[cnt].g ) ; /* Green */
}
outp( 0x448,1 ) ; /* プライオリティレジスタ */
outp( 0x44A,0x09 ) ; /* レイヤ0:16色パレット */
for ( cnt=0; cnt<16; cnt++ ) {
outp( 0xFD90,cnt ) ; /* palette no. */
outp( 0xFD92,_pal160.pal[cnt].b ) ; /* Blue */
outp( 0xFD94,_pal160.pal[cnt].r ) ; /* Red */
outp( 0xFD96,_pal160.pal[cnt].g ) ; /* Green */
}
outp( 0x448,1 ) ; /* プライオリティレジスタ */
#if 0
outp( 0x44A,_vdc[1] ) ;
#endif
for ( cnt=0; cnt<TMP_SIZE; cnt++ ) _tmp[cnt] = 0 ;
switch ( _para.disp ) { /* 表示ページ */
case 1: outp( 0x44A,0x09 ) ; /* page0のみ表示 */
for ( cnt=256, off=VRAM_HALF; cnt<512; cnt++, off+=TMP_SIZE ) {
movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
}
break ;
case 2: outp( 0x44A,0x20 ) ; /* page1のみ表示 */
for ( cnt=0, off=0; cnt<256; cnt++, off+=TMP_SIZE ) {
movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
}
break ;
case 3: outp( 0x44A,0x20 ) ; /* page0前面表示 */
break ;
case 4: outp( 0x44A,0x09 ) ; /* page1前面表示 */
break ;
}
outp( 0xFDA0,0x0A ) ; /* page0&1表示 */
}
void setdisp( void )
{
int zx0, zy0, zx1, zy1 ;
_para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
_para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS */
setdos() ;
return ;
}
EGB_resolution( Gwork,0,_para.p0 ) ; /* page0 */
EGB_resolution( Gwork,1,_para.p1 ) ; /* page1 */
zx0 = _para.zx0 == 3 ? 4 : _para.zx0 ;
zy0 = _para.zy0 == 3 ? 4 : _para.zy0 ;
EGB_writePage( Gwork,0 ) ; /* page0を処理開始 */
if ( _para.p0 >= 12 && _para.p0 <= 14 ) { /* 256色 */
EGB_palette( Gwork,0,(char *)&_pal256 ) ;
} else if ( _para.p0 >= 1 && _para.p0 <= 4 ) { /* 16色 */
EGB_palette( Gwork,0,(char *)&_pal160 ) ;
}
EGB_displayStart( Gwork,2,zx0,zy0 ) ; /* 画面の拡大 */
EGB_displayStart( Gwork,0,0,0 ) ; /* 表示開始位置 */
EGB_displayStart( Gwork,1,0,0 ) ; /* 仮想画面開始位置 */
EGB_displayStart( Gwork,3,_sx0,_sy0 ) ; /* 表示画面の大きさ */
if ( _para.p0 < 12 ) { /* 2画面モード */
zx1 = _para.zx1 == 3 ? 4 : _para.zx1 ;
zy1 = _para.zy1 == 3 ? 4 : _para.zy1 ;
EGB_writePage( Gwork,1 ) ; /* page1を処理開始 */
if ( _para.p1 >= 1 && _para.p1 <= 4 ) { /* 16色 */
EGB_palette( Gwork,0,(char *)&_pal161 ) ;
}
EGB_displayStart( Gwork,2,zx1,zy1 ) ; /* 画面の拡大 */
EGB_displayStart( Gwork,0,0,0 ) ; /* 表示開始位置 */
EGB_displayStart( Gwork,1,0,0 ) ; /* 仮想画面開始位置 */
EGB_displayStart( Gwork,3,_sx1,_sy1 ) ; /* 表示画面の大きさ */
}
switch ( _para.disp ) {
case 1: /* page0のみ表示 */
if ( _para.p0 < 12 ) { /* 2画面モード */
EGB_writePage( Gwork,1 ) ; /* page1を処理開始 */
EGB_paintMode( Gwork,0x20 ) ; /* 面塗り */
EGB_writeMode( Gwork,M_PSET ) ; /* PSET描画 */
if ( _para.p1 >= 1 && _para.p1 <= 4 ) { /* 16色 */
EGB_color( Gwork,C_BACK,C_BLACK ) ; /* 背景色 */
} else { /* 32K色 */
EGB_color( Gwork,C_BACK,0x8000 ) ; /* 背景色 */
}
EGB_clearScreen( Gwork ) ; /* 前画面クリア */
EGB_displayPage( Gwork,1,3 ) ; /* page1前面表示 */
} else { /* 1画面モード */
EGB_displayPage( Gwork,0,1 ) ; /* page0のみ表示 */
}
break ;
case 2: /* page1のみ表示 */
EGB_writePage( Gwork,0 ) ; /* page0を処理開始 */
EGB_paintMode( Gwork,0x20 ) ; /* 面塗り */
EGB_writeMode( Gwork,M_PSET ) ; /* PSET描画 */
if ( _para.p0 >= 1 && _para.p0 <= 4 ) { /* 16色 */
EGB_color( Gwork,C_BACK,C_BLACK ) ; /* 背景色 */
} else { /* 32K色 */
EGB_color( Gwork,C_BACK,0x8000 ) ; /* 背景色 */
}
EGB_clearScreen( Gwork ) ; /* 前画面クリア */
EGB_displayPage( Gwork,0,3 ) ; /* page0前面表示 */
break ;
case 3: EGB_displayPage( Gwork,0,3 ) ; /* page0前面表示 */
break ;
case 4: EGB_displayPage( Gwork,1,3 ) ; /* page1前面表示 */
break ;
}
}
void menu( void )
{
int cnt ;
MOS_disp( FALSE ) ; /* マウス非表示 */
ginit() ; /* EGB初期化 */
EGB_color( Gwork,C_FRONT,C_HYELLOW ) ; /* 文字色 */
glocate( _dpara[SEL_TIT].xs,_dpara[SEL_TIT].ys+15 ) ;
gputs( _msg[0] ) ;
glocate( _dpara[SEL_EXEC].xs,_dpara[SEL_EXEC].ys+15 ) ;
gputs( _msg[19] ) ;
EGB_color( Gwork,C_FRONT,C_HWHITE ) ; /* 文字色 */
for ( cnt=1; cnt<19; cnt++ ) {
glocate( _dpara[cnt].xs,_dpara[cnt].ys+15 ) ;
gputs( _msg[cnt] ) ;
}
EGB_paintMode( Gwork,0x20 ) ; /* 面塗り */
EGB_writeMode( Gwork,M_XOR ) ; /* XOR描画 */
EGB_color( Gwork,C_PAINT,C_HLBLUE ) ; /* 面塗り色 */
if ( _para.p0 < 0 ) { /* MS-DOS */
reverse( -1,SEL_DOS ) ; /* MS-DOS画面 */
} else {
reverse( -1,_para.p0 ) ; /* page0の画面モード */
if ( _para.p0 < 12 ) { /* 2画面モード */
reverse( -1,_para.p1+P1_1-1 ) ; /* page1の画面モード */
}
}
reverse( -1,_para.disp+D0_0-1 ) ; /* 表示ページ */
reverse( -1,_para.zx0+P0_X1-1 ) ; /* page0のX倍率 */
reverse( -1,_para.zy0+P0_Y1-1 ) ; /* page0のY倍率 */
if ( _para.p0 < 12 ) { /* 2画面モード */
reverse( -1,_para.zx1+P1_X1-1 ) ; /* page1のX倍率 */
reverse( -1,_para.zy1+P1_Y1-1 ) ; /* page1のY倍率 */
}
}
void move_disp( int status )
{
int zm ;
if ( !(status & PAD_A) ) { /* A on (page1) */
if ( _para.p0 >= 12 ) return ; /* 1画面モード */
if ( _tim1 < 1 ) return ;
if ( !(status & PAD_RIGHT) ) _para.vx1++ ;
if ( !(status & PAD_LEFT) ) _para.vx1-- ;
if ( !(status & PAD_DOWN) ) _para.vy1++ ;
if ( !(status & PAD_UP) ) _para.vy1-- ;
_tim1 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS画面 */
/* テキスト画面 1024*512 */
outp( 0x440,0x15 ) ; /* FA1 */
outpw( 0x442,_para.vx1/2+_para.vy1*_crtc[0x18] ) ;
zm = _para.zx1 == 3 ? 4 : _para.zx1 ;
outp( 0x440,0x16 ) ; /* HAJ1 */
outpw( 0x442,_crtc[0x0B]-zm*(_para.vx1&0x01) ) ;
return ;
}
EGB_writePage( Gwork,1 ) ; /* page1描画 */
if ( EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ) {
if ( !(status & PAD_RIGHT) ) --_para.vx1 ;
if ( !(status & PAD_LEFT) ) ++_para.vx1 ;
if ( !(status & PAD_DOWN) ) --_para.vy1 ;
if ( !(status & PAD_UP) ) ++_para.vy1 ;
}
} else { /* A/B off (page0) */
if ( _tim0 < 1 ) return ;
if ( !(status & PAD_RIGHT) ) _para.vx0++ ;
if ( !(status & PAD_LEFT) ) _para.vx0-- ;
if ( !(status & PAD_DOWN) ) _para.vy0++ ;
if ( !(status & PAD_UP) ) _para.vy0-- ;
_tim0 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS画面 */
/* グラフィック画面 640*819 */
outp( 0x440,0x11 ) ; /* FA0 */
outpw( 0x442,_para.vx0/2+_para.vy0*_crtc[0x14] ) ;
zm = _para.zx0 == 3 ? 4 : _para.zx0 ;
outp( 0x440,0x12 ) ; /* HAJ0 */
outpw( 0x442,_crtc[0x09]-zm*(_para.vx0&0x01) ) ;
return ;
}
EGB_writePage( Gwork,0 ) ; /* page0描画 */
if ( EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ) {
if ( !(status & PAD_RIGHT) ) --_para.vx0 ;
if ( !(status & PAD_LEFT) ) ++_para.vx0 ;
if ( !(status & PAD_DOWN) ) --_para.vy0 ;
if ( !(status & PAD_UP) ) ++_para.vy0 ;
}
}
}
void start_disp( int status )
{
if ( !(status & PAD_A) ) { /* A on (page1) */
if ( _para.p0 >= 12 ) return ; /* 1画面モード */
if ( _tim1 < 1 ) return ;
if ( !(status & PAD_RIGHT) ) _para.sx1++ ;
if ( !(status & PAD_LEFT) ) _para.sx1-- ;
if ( !(status & PAD_DOWN) ) _para.sy1++ ;
if ( !(status & PAD_UP) ) _para.sy1-- ;
_tim1 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS画面 */
return ;
}
EGB_writePage( Gwork,1 ) ; /* page1描画 */
if ( EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ) {
if ( !(status & PAD_RIGHT) ) --_para.sx1 ;
if ( !(status & PAD_LEFT) ) ++_para.sx1 ;
if ( !(status & PAD_DOWN) ) --_para.sy1 ;
if ( !(status & PAD_UP) ) ++_para.sy1 ;
}
} else { /* A/B off (page0) */
if ( _tim0 < 1 ) return ;
if ( !(status & PAD_RIGHT) ) _para.sx0++ ;
if ( !(status & PAD_LEFT) ) _para.sx0-- ;
if ( !(status & PAD_DOWN) ) _para.sy0++ ;
if ( !(status & PAD_UP) ) _para.sy0-- ;
_tim0 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS画面 */
return ;
}
EGB_writePage( Gwork,0 ) ; /* page0描画 */
if ( EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ) {
if ( !(status & PAD_RIGHT) ) --_para.sx0 ;
if ( !(status & PAD_LEFT) ) ++_para.sx0 ;
if ( !(status & PAD_DOWN) ) --_para.sy0 ;
if ( !(status & PAD_UP) ) ++_para.sy0 ;
}
}
}
void reset_disp( void )
{
_para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
_para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
if ( _para.p0 < 0 ) { /* MS-DOS画面 */
_crtc[0x11] = _crtc_dos[0x11] ;
crtc_out( 0x11 ) ; /* page0フレーム先頭(FA0) */
_crtc[0x12] = _crtc_dos[0x12] ;
crtc_out( 0x12 ) ; /* 水平アジャスト(HAJ0) */
_crtc[0x15] = _crtc_dos[0x15] ;
crtc_out( 0x15 ) ; /* page1フレーム先頭(FA1) */
_crtc[0x16] = _crtc_dos[0x16] ;
crtc_out( 0x16 ) ; /* 水平アジャスト(HAJ1) */
return ;
} else if ( _para.p0 < 12 ) { /* 2画面モード */
EGB_writePage( Gwork,1 ) ; /* page1描画 */
EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ;
EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ;
}
EGB_writePage( Gwork,0 ) ; /* page0描画 */
EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ;
EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ;
}
void mos_action( void )
{
int mbot, mx, my ;
int status, status2;
SND_joy_out( 0x0F,&status,&status2 ); /* 誤動作防止 */
while ( TRUE ) {
MOS_rdpos( &mbot,&mx,&my ) ; /* マウス情報取得 */
if ( mbot == MOS_RIGHT ) return ; /* 右クリック */
if ( mbot == MOS_LEFT ) { /* 左クリック (reset) */
reset_disp() ; /* 表示リセット */
continue ;
}
if ( SND_joy_in_2( 0,&status ) ) continue ;
status &= 0x000000FF;
if ( (status & 0xFF ) == 0xFF ) continue ;
if ( !(status & PAD_SELECT) ) return ; /* SELECT on (menu) */
if ( !(status & PAD_START) ) { /* RUN on (reset) */
reset_disp() ; /* 表示リセット */
continue ;
}
if ( (status & PAD_MOVE) == PAD_MOVE ) continue ;
if ( !(status & PAD_B) ) { /* B on (reset) */
start_disp( status ) ; /* 表示開始位置変更 */
} else {
move_disp( status ) ; /* 仮想画面中の移動 */
}
}
}
void disp( void )
{
int sel, page ;
while ( TRUE ) {
menu() ; /* 初期画面表示 */
if ( (sel=select()) == SEL_END ) break ; /* メニュー選択 */
to_vram() ; /* VRAMへデータ転送 */
page = _para.disp ;
if ( sel == SEL_TIF && _para.disp > 2 ) _para.disp -= 2 ;
setdisp() ; /* 画面設定 */
if ( sel == SEL_TIF ) {
tiff_save() ; /* TIFF保存 */
_para.disp = page ;
} else {
mos_action() ; /* マウス操作 */
}
} ;
mosBreak() ; /* マウス開放待ち */
EGB_resolution( Gwork,0,12 ) ; /* page0:256,1画面モード */
EGB_resolution( Gwork,1,12 ) ; /* page1:error */
EGB_writePage( Gwork,0 ) ; /* page0描画 */
EGB_paintMode( Gwork,0x20 ) ; /* 面塗り */
EGB_writeMode( Gwork,M_PSET ) ; /* PSET描画 */
EGB_color( Gwork,C_BACK,C_BLACK ) ; /* 背景色 */
EGB_clearScreen( Gwork ) ; /* 画面クリア */
}
int getpal( void )
{
int cnt ;
_pal256.npal = (_DWORD)256 ;
for ( cnt=0; cnt<256; cnt++ ) {
_pal256.pal[cnt].no = (_DWORD)cnt ;
if ( fread( &_pal256.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal256.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal256.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
_pal256.pal[cnt].zero = (_BYTE)0 ;
}
_pal160.npal = (_DWORD)16 ;
for ( cnt=0; cnt<16; cnt++ ) {
_pal160.pal[cnt].no = (_DWORD)cnt ;
if ( fread( &_pal160.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal160.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal160.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
_pal160.pal[cnt].zero = (_BYTE)0 ;
}
_pal161.npal = (_DWORD)16 ;
for ( cnt=0; cnt<16; cnt++ ) {
_pal161.pal[cnt].no = (_DWORD)cnt ;
if ( fread( &_pal161.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal161.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
if ( fread( &_pal161.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
_pal161.pal[cnt].zero = (_BYTE)0 ;
}
if ( _para.buf != NULL ) {
if ( fread( _para.buf,1,VRAM_SIZE,_para.fp ) != VRAM_SIZE ) return 1 ;
}
return 0 ;
}
void errWait( void )
{
locate( 2,6 ) ; /* 2桁,6行目 */
gputs( "マウスをクリックして下さい." ) ;
while ( mosButton() == MOS_NONE ) ; /* マウスクリックを待つ */
mosBreak() ; /* マウス開放待ち */
}
void usage( void )
{
locate( 2,4 ) ; /* 2桁,4行目 */
gputs( "Usage: PVD ファイル名.PVS" ) ;
errWait() ;
MOS_end() ; /* MOS終了処理 */
exit( EXIT_FAILURE ) ;
}
void openError( char *fname )
{
locate( 2,4 ) ; /* 2桁,4行目 */
gprintf( "file <%s> open error.",fname ) ;
errWait() ;
MOS_end() ; /* MOS終了処理 */
exit( EXIT_FAILURE ) ;
}
int main( int ac,char *av[] )
{
ginit() ; /* EGB初期化 */
minit() ; /* MOS初期化 */
locate( 2,2 ) ; /* 2桁,2行目 */
gputs( "PVD Version 0.70 (C)パオパオ 1994." ) ;
if ( ac < 2 ) usage() ;
_harderr_retry() ; /* 致命的エラー自動回避 */
if ( (_para.fp=fopen( av[1],"rb" )) == NULL ) openError( av[1] ) ;
_para.fname = av[1] ; /* ファイル名 */
_para.buf = (char *)malloc( VRAM_SIZE ) ; /* 512KB */
if ( _para.buf != NULL ) { /* メモリ確保OK! */
locate( 16,15 ) ; /* 16桁,15行目 */
gputs( "ファイルを読んでいますので、しばらくお待ち下さい." ) ;
}
if ( !getpal() ) { /* パレット読み込み */
TIM_TIME timer ;
unsigned timeno ;
timer.mode = 0 ;
timer.inf = 0 ;
BSETCODEADR( (char *)&timer.adr,int_handler ) ;
timer.hcycle = 0x00 ;
timer.lcycle = 1 ; /* 10ms */
TIM_settime( &timer, (int *)&timeno ) ;
disp() ; /* データ表示 */
TIM_clrtime( timeno ) ;
} else {
locate( 16,15 ) ; /* 16桁,15行目 */
gputs( " " ) ;
locate( 2,4 ) ; /* 2桁,4行目 */
gprintf( "file <%s> read error. ( .PVS ファイルですか? )",av[1] ) ;
errWait() ;
}
if ( _para.buf != NULL ) free( _para.buf ) ;
fclose( _para.fp ) ;
MOS_end() ; /* MOS終了処理 */
return 0 ;
}
/* HISTORY
-----------------------------------------------------------------------------
* 1994.01.03 : CREATE
* 1994.01.10 : パッド操作で画面スクロール,表示位置変更をできるようにした.
* 1994.01.13 : TIFF保存できるようにした.
---------------------------------------------------------------------------*/